/*
 * FK.java
 *
 * Created on 5 de Maio de 2007, 21:38
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor. 
 */

package org.jerm.Mapeamento.Atributos;

import org.jerm.Mapeamento.Tabelas.Tabela;


/**
 *Classe de Atributos do tipo Chave Estrangeira. 
 *
 *<BR>Implementa: 
 * Nome, 
 * Tabela, 
 * Atributo, 
 * onDelete, 
 * onUpdate. 
 *
 *@author Tiago Falcao
 *@version 1.0b 15/05/07
 */
public class FK{
    /**
     * Nome do Atributo
     */
    protected String Nome;
    /**
     * Tabela de Referencia da FK
     */
    protected Tabela Tabela;
    /**
     * Atributo de Referencia da FK
     */
    protected Atributo Atributo;
    /**
     * Acao para Delecao do Atributo de Referencia
     */
    protected String onDelete;
    /**
     * Acao para Atualizacao do Atributo de Referencia
     */
    protected String onUpdate;
    /*
NO ACTION

    Produz um erro indicando que a exclusao ou a atualiza????o cria uma viola????o da restri????o de chave estrangeira. Se a restri????o for postergada, este erro ser?? produzido em tempo de verifica????o de restri????o se ainda houver alguma linha fazendo refer??ncia. Esta ?? a a????o padr??o.
RESTRICT

    Produz um erro indicando que a exclusao ou a atualiza????o cria uma viola????o da restri????o de chave estrangeira. ?? o mesmo que NO ACTION, exceto que a verifica????o n??o ?? posterg??vel.
CASCADE

    Exclui qualquer linha que fa??a referencia ?? linha exclu??da, ou atualiza o valor da coluna que faz refer??ncia para o novo valor da coluna referenciada, respectivamente.
SET NULL

    Atribui o valor nulo ??s colunas que fazem refer??ncia.
SET DEFAULT

    Atribui o valor padr??o ??s colunas que fazem refer??ncia.
     */
    
    /**
     * Atribui NOME ao atributo
     * @param Nome Nome do atributo
     */
    public void setNome(String Nome)
    {
        this.Nome=Nome;
    }
    
    /**
     * Retorna o Nome do atributo
     * @return Retorna o Nome do atributo
     */
    public String getNome()
    {
        String Nome;
        Nome=new String(this.Nome);
        return Nome;
    }
    
    /**
     * Retorna Nome formatado para o SGBD
     * @return String formatada para o SGBD
     * @throws java.lang.Exception Se n???o for definido um nome
     * @param SGBD Nome do SGBD a ser utilizado
     */
    protected String getNomeSQL(String SGBD) throws Exception
    {
        if(this.Nome.length ()==0)
            throw new java.lang.Exception("Atributo sem Nome");
        return this.Nome;
    }
    
    /**
     * Cria nova instancia de FK
     */
    public FK()
    {
        super();
        Tabela=new Tabela();
        Atributo=new AtributoSerial();
        onDelete=new String();
        onUpdate=new String();
    }
    
    /**
     * Determina Referencia da Chave Estrangeira
     * @param Tabela Tabela de Referencia
     * @param Atributo Atributo de Referencia
     * @throws java.lang.Exception Se Atributo de Referencia n???o tiver Nome Definido
     */
    public void setReferencia(Tabela Tabela, AtributoSerial Atributo) throws Exception
    {
        if(Atributo.getNome ().length ()==0)
            throw new java.lang.Exception("Atributo de Referencia sem Nome");
        this.Tabela=Tabela;
        this.Atributo=Atributo;
    }
    
    /**
     * Determina a??????o onDelete
     * @param onDelete Acao onDelete
     * @throws java.lang.Exception Se opcao n???o pertencer as opcoes conhecidas
     */
    public void setonDelete(String onDelete) throws Exception
    {
        onDelete=onDelete.toUpperCase ();
        if(onDelete.equals ("NO ACTION")||onDelete.equals ("RESTRICT")||
                onDelete.equals ("CASCADE")||onDelete.equals ("SET NULL")||onDelete.equals ("SET DEFAULT"))
            this.onDelete=onDelete;
        else
            throw new java.lang.Exception("Opcao Desconhecida para onDelete");
    }
    
    /**
     * Determina a??????o onUpdate
     * @param onUpdate Acao onUpdate
     * @throws java.lang.Exception Se opcao n???o pertencer as opcoes conhecidas
     */
    public void setonUpdate(String onUpdate) throws Exception
    {
        onUpdate=onUpdate.toUpperCase ();
        if(onUpdate.equals ("NO ACTION")||onUpdate.equals ("RESTRICT")||
                onUpdate.equals ("CASCADE")||onUpdate.equals ("SET NULL")||onUpdate.equals ("SET DEFAULT"))
            this.onUpdate=onUpdate;
        else
            throw new java.lang.Exception("Opcao Desconhecida para onUpdate");
        
    }
    
    /**
     * Retorna Codigo de Referencia em SQL para SGBD Generico
     * @return String com codigo de referencia para FK em SQL
     * @throws java.lang.Exception Se FK,Tabela ou Atributo Referencia n???o possuir nome.
     */
    public String getFKSQL() throws Exception
    {
        return this.getFKSQL("SQL");
    }
    
    /**
     * Retorna Codigo de Referencia em SQL para SGBD Especifico
     * @return String com codigo de referencia para FK em SQL para SGBD
     * @param SGBD Nome do SGBD a ser utilizado
     * @throws java.lang.Exception Se FK,Tabela ou Atributo Referencia n???o possuir nome.
     */
    public String getFKSQL(String SGBD) throws Exception
    {
        String Retorno=new String();
        
        Retorno+="foreign key("+this.getNomeSQL (SGBD)+")\treferences\t"+Tabela.getNomeSQL(SGBD)+"("+Atributo.getNomeSQL(SGBD)+")";
        if(onDelete.length()>0)
            Retorno+=" ON DELETE "+onDelete;
        
        if(onUpdate.length()>0)
            Retorno+=" ON UPDATE "+onUpdate;
        
        Retorno+=",";
        return Retorno;
    }
    
    /**
     * Retorna codigo SQL para criacao do Atributo para o SGBD generico.
     * @return String SQL para criacao do Atributo
     * @throws java.lang.Exception Se Atributo n???o possuir Nome ou Tipo
     */ 
    public String getSQL() throws Exception
    {
        return this.getSQL ("SQL");
    }
    
    /**
     * Retorna codigo SQL para criacao do Atributo para o SGBD especificado.
     * @param SGBD Nome do SGBD para o qual sera gerado o SQL
     * @return String SQL para criacao do Atributo
     * @throws java.lang.Exception Se Atributo n???o possuir Nome ou Tipo
     */
    public String getSQL(String SGBD) throws Exception
    {
        return this.getNomeSQL (SGBD)+this.Atributo.getInfoSQL (SGBD)+",";
    }
}
